package top.jiangqiang.qianyi.business.service;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import top.jiangqiang.qianyi.business.model.request.SysFileListRequest;
import top.jiangqiang.qianyi.business.model.request.SysFilePageRequest;
import top.jiangqiang.qianyi.business.model.request.SysFileSaveRequest;
import top.jiangqiang.qianyi.business.model.request.SysFileUpdateRequest;
import top.jiangqiang.qianyi.business.model.response.SysFileDetailResponse;
import top.jiangqiang.qianyi.business.model.response.SysFileListResponse;
import top.jiangqiang.qianyi.business.model.response.SysFilePageResponse;
import top.jiangqiang.qianyi.common.base.model.response.PageResult;
import top.jiangqiang.qianyi.common.base.model.response.Result;
import top.jiangqiang.qianyi.common.base.service.BaseService;
import top.jiangqiang.qianyi.data.model.entity.SysFile;
import top.jiangqiang.qianyi.data.service.SysFileDbService;

import java.util.List;

/**
 * <p>
 * 系统文件表 服务类
 * </p>
 *
 * @author JiangQiang
 * @since 2024-07-19
 */
public interface SysFileService extends BaseService<SysFileDbService, SysFile> {

    Result<PageResult<SysFilePageResponse>> page(SysFilePageRequest request);

    Result<List<SysFileListResponse>> list(SysFileListRequest request);

    Result<Void> add(SysFileSaveRequest request);

    Result<Void> update(SysFileUpdateRequest request);

    Result<SysFileDetailResponse> detail(Long id);

    Result<Void> delete(Long id);

    /**
     * @param multipartFile 文件
     * @return 返回文件访问路径
     */
    SseEmitter upload(MultipartFile multipartFile);

    /**
     * @param fileKey  全局唯一的key，以/开头
     * @param response 响应到接口
     */
    void download(String fileKey, HttpServletResponse response);

    /**
     * @param fileKey 根据指定的fileKey下载文件，以/开头
     * @return 下载到字节数组
     */
    byte[] download(String fileKey);

    /**
     * 获取上传到当前存储器后的文件访问链接
     *
     * @param fileKey 全局唯一的key，以/开头
     * @return
     */
    String getUrl(String fileKey);

    /**
     * 删除文件
     *
     * @param fileKey 全局唯一的key，以/开头
     */
    void delete(String fileKey);
}
